/*
 * Copyright 2006-2007 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.cesce.batch.cobros.items;

import org.springframework.batch.item.ExecutionContext;
import org.springframework.batch.item.ItemReader;
import org.springframework.batch.item.ItemStream;
import org.springframework.batch.item.ItemStreamException;
import org.springframework.batch.item.file.FlatFileItemReader;
import org.springframework.batch.item.file.transform.FieldSet;

import com.cesce.batch.cobros.reverse.Cobcomunicados;
import com.cesce.batch.cobros.reverse.Cobestados;
import com.cesce.batch.cobros.reverse.Cobmotivos;
import com.cesce.batch.cobros.reverse.Cobregistro;


public class ResultadosHostMultilineReader implements ItemReader<Cobcomunicados>, ItemStream {
//	Línea cabecera
	//
//			Tipo Registro = 9  Indica que es una línea de cabecera (N1)
//					IdRegistroCobro -- (N10)
//			 importeCobros -- (N15) (3 últimas decimales) (Se graba en COBREGISTRO cobroscorrectos)
//			Situación (1= aceptado, 2=rechazado) -- (N1)
//					Motivo (A2)
//
//			Tipo Registro = 1  Indica que es una línea de detalle
//					    Nro. consecutivo de cobro(iidCobro) – (N10)
//			NRO. SUPLEMENTO -- (N6)
//			NIF -- (A20)
//			CODIGO CESCE -- (N9)
//			Situación (1= aceptado, 2=rechazado) -- (N1)
//			Motibvo situación -- (N3)
	
	private static final int PRIMERA_LINEA=1;	
	private static final int CABECERA_IDREGISTRO=2;
	private static final int CABECERA_IMPORTE_COBROS=3;
	private static final int CABECERA_SITUACION=4;
	private static final int CABECERA_MOTIVO=5;
	
	private static final int DETALLE_IDCOBRO=2;
	private static final int DETALLE_SUPLEMENTO=3;
	private static final int DETALLE_NIF=4;
	private static final int DETALLE_CODCESCE=5;
	private static final int DETALLE_SITUACION=6;
	private static final int DETALLE_MOTIVO_SITUACION=7;
	
	private static final int TIPO_REGISTRO_CABECERA=9;
	private static final int TIPO_REGISTRO_DETALLE=1;	
	
	private FlatFileItemReader<FieldSet> delegate;

	
	private Cobregistro reg= new Cobregistro();
//TODO: el registro, linea cabecera, habrá que ver como se salva, mejor en un composite writer
	
	public Cobcomunicados read() throws Exception {		

		int lineasLeidas=0;
		boolean isDetalle=true;
		for (FieldSet line = null; (line = this.delegate.read()) != null;) {
			
			Cobcomunicados com = new Cobcomunicados();
			
			
			lineasLeidas++;
			switch(lineasLeidas) {
			
			case PRIMERA_LINEA:  
				int prefix = line.readInt(0);
				switch(prefix) {
				case TIPO_REGISTRO_CABECERA:
					isDetalle=false;
					break;
				case TIPO_REGISTRO_DETALLE:
					isDetalle=true;
					break;
		
				}
			}

			if(isDetalle) {
				switch(lineasLeidas) {
				
				case DETALLE_IDCOBRO:  
					com = Cobcomunicados.findCobcomunicados(line.readBigDecimal(0));
					break;

				case DETALLE_CODCESCE:  
					com.setCodigocesce(line.readString(0));
					break;
					
				case DETALLE_NIF:  
					com.setNif(line.readString(0));
					break;
					
				case DETALLE_SITUACION:  
					
					Cobestados estado = Cobestados.findCobestados(Cobestados.ID_RESULTADO_HOST_ACEPTADO);
					
					if(line.readInt(0)!=1) {
						estado = Cobestados.findCobestados(Cobestados.ID_RESULTADO_HOST_RECHAZADO);
					}
					com.setIdestado(estado);
					break;
					
				case DETALLE_SUPLEMENTO:  
					com = Cobcomunicados.findCobcomunicados(line.readBigDecimal(0));
					break;
					
				case DETALLE_MOTIVO_SITUACION:
					com.setIdmotivo(line.readBigDecimal(0));
					com.getIdregistro().setImportetotal(reg.getImportetotal());
					com.getIdregistro().setIdmotivo(reg.getIdmotivo());
					com.getIdregistro().setIdestado(reg.getIdestado());

					return com;
				}
			}
			else {
				switch(lineasLeidas) {
				
				case CABECERA_IDREGISTRO:  
					break;
				case CABECERA_IMPORTE_COBROS:  
					reg.setImportetotal(line.readBigDecimal(0));
					break;
				case CABECERA_MOTIVO:  
					Cobmotivos motivo = Cobmotivos.findCobmotivos(line.readBigDecimal(0));
					reg.setIdmotivo(motivo);
					break;
				case CABECERA_SITUACION:  
					Cobestados estado = Cobestados.findCobestados(Cobestados.ID_RESULTADO_HOST_ACEPTADO);
					
					if(line.readInt(0)!=1) {
						estado = Cobestados.findCobestados(Cobestados.ID_RESULTADO_HOST_RECHAZADO);
					}
					com.setIdestado(estado);
					break;					
				}
			}

		}
		
		return null;
	}

	public void setDelegate(FlatFileItemReader<FieldSet> delegate) {
		this.delegate = delegate;
	}

	public void close() throws ItemStreamException {
		this.delegate.close();
	}

	public void open(ExecutionContext executionContext) throws ItemStreamException {
		this.delegate.open(executionContext);
	}

	public void update(ExecutionContext executionContext) throws ItemStreamException {
		this.delegate.update(executionContext);
	}

}
